const mysql = require('mysql');

// 获取环境变量的值
const project_name = 'vuecomponent_server_db';
const version = 'v1.0';
const tmp = {"host": "HOST", "port": "PORT", "user": "USER", "pswd": "PSWD", "database": "DB"};
const default_db = {"host": "127.0.0.1", "port": "3306", "user": "root", "pswd": "1234", "database": "vuecomponent_server"};
const { host, port, user, pswd, database } = get_db_info();

// 连接数据库
// console.log([host, port, user, pswd, database]);
// createConnection方法 可能导致长时间未访问数据库，而被数据库单方面断开连接，因此换为 createPool方法
const db = mysql.createPool({
    host: host,
    port: port,
    user: user,
    password: pswd,
    database: database,
    idleTimeoutMinutes: 60,      // 连接空闲超时时间，单位分钟
    // maxAllowedPacket: 1073741824 // 设置为 1GB
    acquireTimeout: 60000, // 设置获取连接的超时时间
    waitForConnections: true,
});

// db.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
//     if (error) throw error;
//     console.log('The solution is: ', results[0].solution);
// });
    
// 设置数据库未连接成功
console.log('\n正在连接数据库。。。请稍等。。。');
db.conn_successful = false;

// 检测数据库是否连接成功（createConnection方法可以使用db.connect来判断是否连接成功）
// db.connect((err) => {
//     if (err) {
//         console.log(`数据库连接失败！！！！`);
//         console.log(` -> host: ${host}`);
//         console.log(` -> port: ${port}`);
//         console.log(` -> user: ${user}`);
//         console.log(` -> password: ${pswd}`);
//         console.log(` -> database: ${database}`);
//         process.exit(1);
//     }
//     console.log('数据库连接成功！  数据库进程id为: ' + db.threadId);
//     db.conn_successful = true;
// });

// 检测数据库是否连接成功
db.getConnection((err, connection) => {
    if (err) {
        console.log(`数据库连接失败！！！！`);
        console.log(` -> host: ${host}`);
        console.log(` -> port: ${port}`);
        console.log(` -> user: ${user}`);
        console.log(` -> password: ${pswd}`);
        console.log(` -> database: ${database}`);
        process.exit(1);
    } else {
        console.log('数据库连接成功！  数据库进程id为: ' + connection.threadId);
        db.conn_successful = true;
        // 释放连接
        connection.release();
    }
});

// 获取数据库连接参数读取不到时使用默认值
function get_db_info() {
    let res = {};
    Object.keys(tmp).forEach((i) => {
        let v = process.env[`${project_name}_${tmp[i]}`];
        if (v) {
            res[i] = v;
        } else {
            console.log(`读取不到系统环境变量: ${project_name}_${tmp[i]} -> 使用默认值: ${default_db[i]}`);
            res[i] = default_db[i];
        }
    });
    return res;
}

module.exports = db;
